package controleur;
import hibernate.siteProduit;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Polygon;
import java.awt.Shape;
import java.awt.geom.Rectangle2D;
import java.io.*; 
import java.util.Iterator;
import java.util.List;

import javax.servlet.*; 
import javax.servlet.http.*; 

import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;

import org.jfree.chart.*; 
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.*; 
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.*; 
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

public class Servlet1 extends HttpServlet { 

 
	

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
		{
			
			
			System.out.println("POST");
	
 HttpSession session = request.getSession(true); 		
	if(request.getParameter("button").equals("Classifierlesproduits"))	
		{
		
		    int Tab[][] = null;
		    String choix="Vide";
		    int AB=-1;
		    int BC=-1;
		    
		    // R�cup�ration des donn�es du formulaire d'index.jsp
			int annee=Integer.parseInt(request.getParameter("annee"));
			int mois=Integer.parseInt(request.getParameter("mois"));
			int liste=Integer.parseInt(request.getParameter("maliste"));
			System.out.println("valeur de AB"+request.getParameter("AB"));
			
			
			if(request.getParameter("AB").isEmpty()==true)
			{
				request.setAttribute("champsVide", "Borne entre classe A et B en %");
				
				
				getServletContext().getRequestDispatcher("/erreur.jsp").forward(request, response);		
			}
			else
			{
			if(request.getParameter("BC").isEmpty()==true)
			{
				request.setAttribute("champsVide", "Borne entre classe B et C en % ");
				getServletContext().getRequestDispatcher("/erreur.jsp").forward(request, response);		
			}
			else{
			if(request.getParameter("choix")==null)
			{
				request.setAttribute("champsVide", "choix de site");
				getServletContext().getRequestDispatcher("/erreur.jsp").forward(request, response);		
			}
			
			
			
			else{ if ((request.getParameter("BC")!=null)&&(request.getParameter("AB")!=null)&&(request.getParameter("choix")!=null)){
				
				choix=request.getParameter("choix");
			    AB= Integer.parseInt(request.getParameter("AB"));
				BC= Integer.parseInt(request.getParameter("BC"));	
				
				
			session.setAttribute("annee", annee);
			session.setAttribute("mois", mois);
			session .setAttribute("liste", liste);
			session.setAttribute("choix", choix);
			session.setAttribute("AB", AB);
			session.setAttribute("BC", BC);
		
			Classification classe=new Classification();
			try {
				
	             Tab=classe.ClassifierProduits(annee,mois,liste, choix,AB,BC);
	             session.setAttribute("Tab", Tab);
			     } 
		 catch (HibernateException e) {
				    // TODO Auto-generated catch block
				    e.printStackTrace();
			                           }
					    
			 // renvoi vers la page resultat.jsp
			getServletContext().getRequestDispatcher("/resultat.jsp").forward(request, response);	
			
			}
			}
			}
			}//fin else
	}//fin if Classifierlesproduits
		
	
	
		
	if(request.getParameter("button").equals("AfficherCourbe"))	
	{
	

        int Tab[][] = null;
        Tab=(int[][]) session.getAttribute("Tab");
	
			//Affichage de la courbe 	
				
				 final String series1 = "Classe A";
				 final String series2 = "Classe B";
				 final String series3 = "Classe C";
			       
			  // create the dataset...
			     final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		         int j=0;
		         int cumul=0;
		         
		         //Classe A
			       while(j<2)
			       {
			    	   
			    	   final String type = Integer.toString(Tab[j][0]);
			            cumul=Tab[j][1];
			    	   dataset.addValue( cumul, series1, type); 
			    	   j++;
			       }
			       j=j-1;
			       while(j<5)
			       {
			    	   
			    	   final String type = Integer.toString(Tab[j][0]);
			            cumul=Tab[j][1];
			    	   dataset.addValue( cumul, series2, type); 
			    	   j++;
			       }
			       j=j-1;
			       
			       while(j<Tab.length)
			       {
			    	   
			    	   final String type = Integer.toString(Tab[j][0]);
			            cumul=Tab[j][1];
			    	   dataset.addValue( cumul, series3, type); 
			    	   j++;
			       }
			       
			       
			       
			       
			       
			        final JFreeChart chart = ChartFactory.createLineChart(
				            "Classification des produits",      // chart title
				            "",                   // domain axis label
				            "Cumul des consommations moyennes",                  // range axis label
				            dataset,                  // data
				            PlotOrientation.VERTICAL, // orientation
				            true,                     // include legend
				            true,                     // tooltips
				            false                     // urls
				        );



				        final Shape[] shapes = new Shape[3];
				        int[] xpoints;
				        int[] ypoints;

				        // right-pointing triangle
				        xpoints = new int[] {-3, 3, -3};
				        ypoints = new int[] {-3, 0, 3};
				        shapes[0] = new Polygon(xpoints, ypoints, 3);

				        // vertical rectangle
				        shapes[1] = new Rectangle2D.Double(-2, -3, 3, 6);

				        // left-pointing triangle
				        xpoints = new int[] {-3, 3, 3};
				        ypoints = new int[] {0, -3, 3};
				        shapes[2] = new Polygon(xpoints, ypoints, 3);

				        final DrawingSupplier supplier = new DefaultDrawingSupplier(
				            DefaultDrawingSupplier.DEFAULT_PAINT_SEQUENCE,
				            DefaultDrawingSupplier.DEFAULT_OUTLINE_PAINT_SEQUENCE,
				            DefaultDrawingSupplier.DEFAULT_STROKE_SEQUENCE,
				            DefaultDrawingSupplier.DEFAULT_OUTLINE_STROKE_SEQUENCE,
				            shapes
				        );
				        final CategoryPlot plot = chart.getCategoryPlot();
				        plot.setDrawingSupplier(supplier);

				        chart.setBackgroundPaint(Color.white);

				        // set the stroke for each series...
				        plot.getRenderer().setSeriesStroke(
				            0, 
				            new BasicStroke(
				                2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 
				                1.0f, new float[] {10.0f, 6.0f}, 0.0f
				            )
				        );
				        plot.getRenderer().setSeriesStroke(
				            1, 
				            new BasicStroke(
				                2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,
				                1.0f, new float[] {6.0f, 6.0f}, 0.0f
				            )
				        );
				        plot.getRenderer().setSeriesStroke(
				            2, 
				            new BasicStroke(
				                2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,
				                1.0f, new float[] {2.0f, 6.0f}, 0.0f
				            )
				        );

				        // customise the renderer...
				        final LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer();
		                // renderer.setDrawShapes(true);
				        renderer.setItemLabelsVisible(true);
				       //  renderer.setLabelGenerator(new StandardCategoryLabelGenerator());

				        // customise the range axis...
				        final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
				        rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
				        rangeAxis.setAutoRangeIncludesZero(false);
				        rangeAxis.setUpperMargin(0.12);
				        

				        
				        
				        OutputStream out = response.getOutputStream(); 
				        response.setContentType("image/png"); 
				        ChartUtilities.writeChartAsPNG(out, chart, 400, 300); 
				        
				        
			
	}//AfficherCourbe

	
	
	if(request.getParameter("button").equals("AfficherTableau"))	
	{

	    // R�cup�ration des donn�es de la session
		Object  OAnnee= session.getAttribute("annee");	
		Object  OMois= session.getAttribute("mois");
		Object  Oliste= session.getAttribute("liste");
		Object  Ochoix= session.getAttribute("choix");	
		Object  OAB= session.getAttribute("AB");
		Object  OBC= session.getAttribute("BC");
		
		int annee2=Integer.parseInt(OAnnee.toString());
		int mois2=Integer.parseInt(OMois.toString());
		int liste2=Integer.parseInt(Oliste.toString());
		int AB2=Integer.parseInt(OAB.toString());
		int BC2=Integer.parseInt(OBC.toString());
		String choix2=Ochoix.toString();
		
		
		
		
		Acces acces =new Acces();
		
		 List<?> SiteProduit = null;
		try {
			SiteProduit = acces.recuperer_SiteProduit();
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		
		request.setAttribute("SiteProduit", SiteProduit);
		request.setAttribute("annee", annee2);
		request.setAttribute("mois", mois2);
		request.setAttribute("periode", liste2);
		request.setAttribute("AB", AB2);
		request.setAttribute("BC", BC2);
		request.setAttribute("choix", choix2);
		
		getServletContext().getRequestDispatcher("/AfficherTableau.jsp").forward(request, response);
		
	
	}//AfficherTableau	
		

	
	
	
	
		
	//Affichage des cas particuliers	
		if(request.getParameter("button").equals("AfficherCasParticuliers"))	
		{	
			

			Object  OAnnee= session.getAttribute("annee");	
			Object  OMois= session.getAttribute("mois");
			Object  Oliste= session.getAttribute("liste");
			Object  Ochoix= session.getAttribute("choix");	
			Object  OAB= session.getAttribute("AB");
			Object  OBC= session.getAttribute("BC");
			
			int annee2=Integer.parseInt(OAnnee.toString());
			int mois2=Integer.parseInt(OMois.toString());
			int liste2=Integer.parseInt(Oliste.toString());
			int AB2=Integer.parseInt(OAB.toString());
			int BC2=Integer.parseInt(OBC.toString());
			String choix2=Ochoix.toString();	
			
			

			Acces acces =new Acces();
			
			 List<?> SiteProduit = null;
			try {
				SiteProduit = acces.recuperer_SiteProduit();
			} catch (HibernateException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}	 
			 
			request.setAttribute("SiteProduit", SiteProduit);
			request.setAttribute("annee", annee2);
			request.setAttribute("mois", mois2);
			request.setAttribute("periode", liste2);
			request.setAttribute("AB", AB2);
			request.setAttribute("BC", BC2);
			request.setAttribute("choix", choix2);
			
			getServletContext().getRequestDispatcher("/AfficherCasParticuliers.jsp").forward(request, response);	
			
			
			
		}//fin cas particliers
		
		
		
       
		
		
		if(request.getParameter("button").equals("Classifier les produits"))	
		{
			getServletContext().getRequestDispatcher("/index1.jsp").forward(request, response);	
		}
		
		}

		
		
		}//fin post







//GET
  
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	 HttpSession session2 = request.getSession(true); 
		System.out.println("GET");
		
		if(request.getParameter("button").equals("recalculer"))	
		{
					 
			
			
		int site=Integer.parseInt(request.getParameter("site"));
		int AB =Integer.parseInt(request.getParameter("AB"));
		int BC =Integer.parseInt(request.getParameter("BC"));
		String choix =request.getParameter("choix");
		session2.setAttribute("site", site);
		session2.setAttribute("AB", AB);
		session2.setAttribute("BC", BC);
		session2.setAttribute("choix", choix);
		
		//Afficher un nouveau formulaire pour le choix : ann�e mois et p�riode  (des nouveaux param�tres)
		getServletContext().getRequestDispatcher("/reponse.jsp").forward(request, response);	
		}//fin  recalculer
		
		
		
		if(request.getParameter("button").equals("recalculerBoutique"))	
		{
			
			//r�cup�rer les valeurs qui changenet pas les bornes le choix (boutique ou depot)
			Object  OAB= session2.getAttribute("AB");
			Object  OBC= session2.getAttribute("BC");
			Object  Ochoix= session2.getAttribute("choix");
			Object  Osite= session2.getAttribute("site");
			
			int AB2=Integer.parseInt(OAB.toString());
			int BC2=Integer.parseInt(OBC.toString());
			String choix2=Ochoix.toString();
			int site=Integer.parseInt(Osite.toString());
			
			//r�cup�rer les nouveaux param�tres choisis par l'utilisateur
			int annee=Integer.parseInt(request.getParameter("annee"));
			int mois=Integer.parseInt(request.getParameter("mois"));
			int liste=Integer.parseInt(request.getParameter("maliste"));
			
		
			RecalculerClassifacationBoutique RCB=new RecalculerClassifacationBoutique();
			try {
				RCB.Recalculer(annee, mois ,liste, choix2, site,AB2,BC2);
			} catch (HibernateException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			
			
			Acces acces =new Acces();
			
			 List<?> SiteProduit = null;
			try {
				SiteProduit = acces.recuperer_SiteProduit();
			} catch (HibernateException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}	 
	
			request.setAttribute("SiteProduit", SiteProduit);
			request.setAttribute("AB", AB2);
			request.setAttribute("BC", BC2);
			request.setAttribute("choix", choix2);
			
			getServletContext().getRequestDispatcher("/AfficherTableau.jsp").forward(request, response);
				
			
		
		}//fin recalculerBoutique
		
		
		//retour au menu principal
				if(request.getParameter("button").equals("retour a la page principale de la classification"))	
				{
					getServletContext().getRequestDispatcher("/index1.jsp").forward(request, response);	
				}
		
		
		//retour au menu principal
		if(request.getParameter("button").equals("Retour au menu Principal"))	
		{
			getServletContext().getRequestDispatcher("/resultat.jsp").forward(request, response);	
		}
		
	}
}